#ifndef TRAIT_H
#define TRAIT_H

#include <iostream>

using namespace std;

/**
 * Classe qui permet de se simplifier la vie pour la gestion des
 * traits. En effet ici on stocke une valeur énumérée (qui va de 0 à
 * 6, pour les six traits différent et le score de force
 * exceptionnelle) pouvant être utilisée comme un entier positif (donc
 * comme un indice) ou une string pour l'affichage.
 *
 * @author Johan "Solo" Luisier
 */
class Trait
{
protected:
  /**
   * Enumère les différents traits existants. Un septième a été ajouté
   * à la liste traditionnelle pour gérer la force exceptionnelle.
   */
  enum enumTrait
    {
      For  = 0, /**< Correspond à la force. */
      Dex  = 1, /**< Correspond à la dextérité. */
      Cons = 2, /**< Correspond à la constitution. */
      Int  = 3, /**< Correspond à l'intelligence. */
      Sag  = 4, /**< Correspond à la sagesse. */
      Char = 5, /**< Correspond au charisme. */
      Exc  = 6  /**< Correspond au score de force exceptionnelle. */
    };
  /**
   * Numéro du trait de l'instance courante.
   */
  enumTrait Valeur;
public:
  Trait(const enumTrait& trait = For);
  Trait(const unsigned int& trait);
  ~Trait();
  void setValeur(const enumTrait& trait);
  void setValeur(const unsigned int& trait);
  friend ostream& operator<<(ostream& os, const Trait& trait);
  unsigned int valeur() const;
  operator unsigned int() const;
};

#endif // TRAIT_H
